package simulationgps;
import java.util.ArrayList;

public class Plan {
	ArrayList<Carrefour> carrefours;
	ArrayList<Rue> rues;

	
	/** Constructeur */
	public Plan() {
		this.carrefours = new ArrayList();
		this.rues = new ArrayList();
	}
	/** Ajout d'un carrefour */
	public Carrefour ajoutCarrefour(String nom) {
		Carrefour car = new Carrefour(nom); this.carrefours.add(car); return(car);
	}
	/** Ajout d'une rue.  Retourne false si les carrefours car1 ou car2 n'existent pas */
	public void ajoutRue(Rue rue) {
		rues.add(rue);
	}
	/** Affichage des rues du plan */
	public void afficherPlan() {
		for (int i=0; i < this.rues.size(); i++) {
			Rue rue = (Rue) this.rues.get(i); rue.afficher(rue.getTronconRacine());
		}
	}
	/** Test de l'existence d'un chemin de longueur < l allant de car1 à  car2 
	 * @param tronconPre: Troncon à exclure du parcours 
	 * 
	*/
	public boolean existeChemin(Troncon tronconPre, Carrefour car1, Carrefour car2, int l) {
		if (car1==car2) return true;
		else if (l <= 1) return false;		
		else {
			MaillonTroncon mtr= car1.tronconsParcourables(car1.getMaillonTroncon());
			if(mtr==null)
				return false;
			else {
				boolean trouve = false;
				while (mtr.getCourant() != null) {
					// Quand on parcours un troncon déjà, on l'exclu de la recherche suivante
					if (mtr.getCourant() != tronconPre) 
						trouve = existeChemin(mtr.getCourant(), mtr.getCourant().parcourir(car1), car2, l - 1);
					mtr = mtr.getSuivant();
				}
				return trouve;
			}
		} // End else
	}
//	/** Test de la correction du plan : on doit pouvoir aller de tout carrefour Ã  tout carrefour */
//	public void planCorrect() { boolean ok=true;
//		for (int i=0; i < this.carrefours.size(); i++)
//			for (int j=0; j < this.carrefours.size(); j++) 
//			{ Carrefour car1 = (Carrefour) this.carrefours.get(i);
//			  Carrefour car2 = (Carrefour) this.carrefours.get(j);
//				if (!this.existeChemin(car1, car2, this.carrefours.size())) {ok=false;
//				System.out.print("pas de chemin de "); car1.afficherCarrefour();
//				System.out.print(" Ã  "); car2.afficherCarrefour(); System.out.println("");
//				}
//			}
//		if (ok) System.out.println("Le plan est correct.");
//	}
//	
//	/** Retourne un chemin optimal de longueur < l allant de car1 Ã  car2.
//	 * Retourne un chemin Ã©valuÃ© de longueur -1 si un tel chemin n'existe pas
//	 * Retourne un chemin Ã©valuÃ© vide (de longueur 0) si car1 == car2 */
//	public CheminEvalue cheminOptimal(Carrefour car1, Carrefour car2, int l) {
//		ArrayList<CheminEvalue> listeChemins = new ArrayList<CheminEvalue>();
//		CheminEvalue cheminEvalue = new CheminEvalue();
//		if (car1==car2) return(cheminEvalue);
//		else if (!existeChemin(car1,car2,l)) {cheminEvalue.setLongueur(-1); return(cheminEvalue);}
//		else {
//			for (int i=0; i < this.rues.size(); i++) {
//				Rue rue = (Rue) this.rues.get(i); int ll = rue.longueur; int duree = rue.dureeParcours;
//			if (rue.donneCarrefour1()==car1) {// on parcours un tronÃ§on de rue
//				cheminEvalue = cheminOptimal(rue.donneCarrefour2(),car2,l-1);
//				if (cheminEvalue.getLongueur()!=-1) {cheminEvalue.getRues().add(0,rue);
//					cheminEvalue.longueur += ll; cheminEvalue.dureeParcours += duree;
//					listeChemins.add(cheminEvalue);
//				}
//			}
//			// Mais on peut aussi prendre dans l'autre sens une rue Ã  double sens
//			if (rue.estDoubleSens() && rue.donneCarrefour2()==car1) {
//				cheminEvalue = cheminOptimal(rue.donneCarrefour1(),car2,l-1);
//				if (cheminEvalue.getLongueur()!=-1) {cheminEvalue.getRues().add(0,rue);
//					cheminEvalue.longueur += ll; cheminEvalue.dureeParcours += duree;
//					listeChemins.add(cheminEvalue);
//			}}
//			} // End for
//			// Dans listeChemins, il faut chercher le chemin optimal
//			int min = 99999999; CheminEvalue chMin = new CheminEvalue();
//			for (int i=0; i < listeChemins.size(); i++) 
//			{CheminEvalue ch = listeChemins.get(i);
//			if (ch.getLongueur() < min) {min = ch.getLongueur(); chMin = ch;}
//			} // End for
//			return(chMin);
//		} // End else
//	}
	
}
